A debugger is a computer program used to test and debug other programs, which are referred to as debuggee programs or simply as “debuggees”. A debugger generally provides a software developer with some control over debuggee execution, such as pausing execution to examine the debuggee's variables and other internal state information, stepping through debuggee code line-by-line, and setting a breakpoint to stop debuggee execution when a specified condition occurs within the debuggee. Some debuggers also allow a developer to modify the debuggee's internal state during debugging by setting variables, instead of merely observing the internal state.
Most debuggers provide command line user interfaces, for enhanced portability and decreased computing resource requirements. However, some debuggers have compatible front-ends that interact with their command line user interface. For example, a front-end may integrate a debugger with an Integrated Development Environment. Likewise, a front-end may provide graphics or visualization capabilities to users. In effect, each front-end becomes part of the debugger's user interface, thereby enhancing the debugger's usefulness.
However, the capabilities of a debugger user interface are also limited by kind of the information the user interface receives from a debugger engine. A debugger's engine is the portion of the debugger that interacts directly with, and controls, the debuggee. A debuggee program typically has different levels of abstraction, ranging from low-level machine code, up through data structures and procedures, then even higher to a user interface level, and finally to an intended purpose at the highest level of abstraction. Accordingly, many choices are made in a debugger about what information the debugger engine will provide to the debugger user interface, and about how that information will be provided.